const { Menu, RoleMenu } = require("../../../models");
module.exports = {
  // 绑定
  async bindRoleMenu({ id, perms }, t) {
    // 先删除所有跟id有关的数据
    await RoleMenu.destroy({
      where: {
        roleId: id,
      },
      transaction: t,
    });

    // 保存角色、菜单、按钮
    await RoleMenu.bulkCreate(
      Object.keys(perms).map((menuId) => {
        const btnList = perms[menuId];
        return {
          roleId: id,
          menuId,
          btnIds: btnList.length > 0 ? btnList.join(",") : null,
        };
      }),
      { transaction: t }
    );
  },
  // 校验传递的菜单参数是否合法
  async checkMenuIds(menuIds) {
    // 不能为空
    if (!menuIds) {
      throw new Error("菜单参数不能为空");
    }
    // 必须是数组
    if (!Array.isArray(menuIds)) {
      throw new Error("菜单参数必须为数组");
    }

    // 不能包含重复的菜单id
    if (new Set(menuIds).size !== menuIds.length) {
      throw new Error("菜单参数不能包含重复的菜单id");
    }
    // 判断传递的菜单id是否合法
    const menusNum = await Menu.count({
      where: {
        id: menuIds,
      },
    });
    if (menusNum !== menuIds.length) {
      throw new Error("查询到部分菜单id不存在,请检查后重试");
    }
  },

  // 根据roleId查询菜单id
  async getRoleMenuIds(roleId) {
    const roleMenus = await RoleMenu.findAll({
      where: {
        roleId,
      },
    });
    let btnParams = {},
      menuIds = [];
    roleMenus?.forEach((roleMenu) => {
      btnParams[roleMenu.menuId] = roleMenu.btnIds?.split(",") || [];
      menuIds.push(roleMenu.menuId);
    });

    return {
      menuIds,
      btnParams,
    };
  },
};
